package cn.dglydrpy.study.algorithm.od;

import java.util.*;

/**
 * @author Yyy
 * @date 2024/11/10 14:08
 * @description
 * 给定表示固态硬盘磨损度（0 到 10000 之间且无重复值）的数组endurances，需要找出磨损度最高和最低的三块盘的下标。
 * 
 输入：
1 50 40 68 72 86 35 14 87 99 63 75
 输出：
5 8 9
0 6 7 

输入：
9999 8888 7777 6666 5555 4444 3333
输出：
0 1 2 
4 5 6 
 */
public class Od0035_Top3MaxAndTop3Min {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLine()){
            String[] s = scanner.nextLine().split(" ");
            int[] endurances = new int[s.length];
            for(int i = 0;i<s.length; i++){
                endurances[i] = Integer.valueOf(s[i]);
            }
            
            String ans = myAnswer(endurances);
            System.out.println(ans);
            
        }
        
    }

    private static String myAnswer(int[] endurances) {
        
        StringBuilder ans = new StringBuilder();
        
        // 门槛堆
        // 放最大的3个
        PriorityQueue<int[]> minQueue = new PriorityQueue<>(
                (o1,o2) -> o1[0] - o2[0]
        );

        // 放最小的3个
        PriorityQueue<int[]> maxQueue = new PriorityQueue<>(
                (o1,o2) -> o2[0] - o1[0]
        );
        
        for(int i = 0;i<endurances.length;i++){
            if(minQueue.size() < 3){
                minQueue.add(new int[]{endurances[i],i});
            }else{
                if(minQueue.peek()[0] < endurances[i]){
                    minQueue.poll();
                    minQueue.add(new int[]{endurances[i],i});
                }
            }

            if(maxQueue.size() < 3){
                maxQueue.add(new int[]{endurances[i],i});
            }else{
                if(maxQueue.peek()[0] > endurances[i]){
                    maxQueue.poll();
                    maxQueue.add(new int[]{endurances[i],i});
                }
            }
        }

        ArrayList<Integer> list = new ArrayList<>();
        while (!minQueue.isEmpty()){
            list.add(minQueue.poll()[1]);
        }
        list.sort((a,b) -> a-b);
        for(int a : list){
           ans.append(a + " ");
        }
        
        ans.append("\n");

        list.clear();
        while (!maxQueue.isEmpty()){
            list.add(maxQueue.poll()[1]);
        }
        list.sort((a,b) -> a-b);
        for(int a : list){
            ans.append(a + " ");
        }
        
        return ans.toString().trim();
        
    }
}
